<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 1.通过原型链继承
    // 让一个构造函数的原型等于另一个构造函数的实例，那么这个构造函数new出来的实例就具有另一个实例的属性和方法
    // function Parent(gender) {
    //     this.isShow = true;
    //     this.info = {
    //         name: '小红',
    //         age: 18
    //     }
    // }
    // Parent.prototype.getInfo = function () {
    //     console.log(this.isShow);
    //     console.log(this.info);
    // }

    // let parent1 = new Parent()
    // console.log(parent1.info);
    // function Child() { }
    // Child.prototype = new Parent()
    // let child1 = new Child()
    // child1.info.gender = '女'
    // console.log(child1);
    // let child2 = new Child()
    // child2.food = '食物'
    // console.log(child2);

    // 优点：书写方便简洁，容易理解
    // 缺点：对象实例共享所有继承的属性和方法，无法向父类构造函数传参

    // 2.借用构造函数继承
    // function Parent(gender) {
    //     this.info = {
    //         name: 'lisi',
    //         age: 15,
    //         gender: gender
    //     }
    //     this.say = function () {
    //         console.log("我喜欢唱歌");
    //     }
    // }
    // function Child(gender) {
    //     Parent.call(this, gender)
    // }
    // let parent1 = new Parent()
    // console.log(parent1);
    // let child1 = new Child('男')
    // child1.info.shool = '理工'
    // console.log(child1);
    // let child2 = new Child('女')
    // child2.say()

    // 3.组合继承
    // function Parent(gender) {
    //     this.info = {
    //         name: 'lisi',
    //         age: 15,
    //         gender: gender
    //     }
    // }
    // Parent.prototype.say = function () {
    //     console.log("我会唱歌");
    // }
    // function Child(gender) {
    //     Parent.call(this, gender)
    // }

    // Child.prototype = new Parent()
    // Child.prototype.constructor = Child
    // Child.hoby = '网球'

    // let child1 = new Child('男')
    // child1.info.shool = '理工'
    // child1.say()
    // console.log(child1);
    // let child2 = new Child('女')
    // child2.food = '食物'
    // child2.play = function () {
    //     console.log("我要玩游戏");
    // }
    // console.log(child2);
    // child2.play()

    // 4.ES6 Class类实现继承
    class Animal {
        constructor(kind, food) {
            this.kind = kind
            this.food = food
        }
        getKind() {
            console.log("动物");
        }
    }
    const animal1 = new Animal("样式", '食物')
    console.log(animal1);
    class Cat extends Animal {
        constructor(name) {
            // 子类的构造方法中必须先调用super方法
            super('cat', 'eat')//显式的调用父类的指定属性或者方法
            this.name = name

        }
        getCatInfo() {
            console.log(this.name);
        }
    }
    Cat.say = function () {
        console.log("唱歌 ");
    }
    const cat1 = new Cat('fish')
    cat1.own = '底子'
    cat1.getKind() //动物
    console.log(cat1);
    cat1.getCatInfo();//fish
    const cat2 = new Cat('rou')
    console.log(cat2);
    cat2.getKind()//动物
    Cat.say()//唱歌
</script>

</html>